<?php

class Wlib_Model_DbMapper_SystemEntity extends Wlib_Model_DbMapper_AbstractDbMapper
{
    public $_authorizedUserId = null;

    public function getAuthorizedUserId()
    {
        if (null === $this->_authorizedUserId) {
            $authStorage = Zend_Auth::getInstance()->getStorage()->read();
            if($authStorage && $authStorage->id) {
                $this->setAuthorizedUserId($authStorage->id);
            }
        }
        return $this->_authorizedUserId;
    }

    public function setAuthorizedUserId($userId)
    {
        $this->_authorizedUserId = $userId;
        return $this;
    }

    public function insert($values)
    {
        $values = $this->checkValues($values);

        /*$values['creation_time'] = date('Y-m-d H:i:s', time());
        $values['creator_user_id'] = $this->getAuthorizedUserId();*/

        $dbTable = $this->getDbTable();
        return $dbTable->insert($values);
    }

    public function update($values, $where)
    {
        $values = $this->checkValues($values);

/*        $values['edition_time'] = date('Y-m-d H:i:s', time());
        $values['editor_user_id'] = $this->getAuthorizedUserId();*/

        $dbTable = $this->getDbTable();
        return $dbTable->update($values, $where);
    }

    public function updateById($values, $id)
    {
        return $this->update($values, array('id = ?' => $id));
    }

    /**
     * Сохраняет переданные значения
     *
     * Если $id не равен нулю, то обновляет данные, иначе вставляет данные
     *
     * Возвращает идентификатор вставленного/обновленного объекта
     *
     * @param  array $values
     * @param  int $id
     * @return int
     */
    public function save($values, $id)
    {
        if($id) {
            $this->updateById($values, $id);
            return $id;
        } else {
            return $this->insert($values);
        }
    }

    public function deleteById($id)
    {
        $id = intval($id);
        $where = $this->getDbTable()->getAdapter()->quoteInto('id = ?', $id);

        if($id) $this->getDbTable()->delete($where);
    }

    public function deleteByExpr($where)
    {
        $values = array('is_deleted' => 1);
        $this->update($values, $where);
    }

    /**
     * @return Zend_Db_Table_Select
     */
    public function select()
    {
        $dbTable = $this->getDbTable();
        $select = $dbTable->select(true);

/*        $select->setIntegrityCheck(false)
               ->where($dbTable->info('name') . '.is_deleted != 1');*/

        return $select;
    }

    public function selectByExpr($where, $limit = false, $order = array())
    {
        $select = $this->select()->where($where[0], $where[1]);

        if($limit) {
            $select->limit($limit, 0);
        }

        if(count($order)) {
            $select->order($order);
        }

        return $this->fetchAll($select);
    }

    public function selectRowByExpr($where)
    {
        $select = $this->select()->where($where[0], $where[1]);
        return $this->getDbTable()->fetchRow($select);
    }


    public function checkValues($values)
    {
        $cols = $this->getDbTable()->info('cols');

        foreach ($values as $key => $value) {
            if(!in_array($key, $cols)) {
                unset($values[$key]);
            }
        }

        return $values;
    }

    public function getListWithOneFieldInRow($where='', $columName = 'name', $order='')
    {
        $select = $this->select()
            ->reset(Zend_Db_Select::COLUMNS)
            ->columns(array('id', $columName));

        if($order) {
            $select->order($order . ' ASC');
        } else {
            $select->order('id ASC');
        }

        if(count($where) == 2) {
            $select = $this->select()->where($where[0], $where[1]);
        }

        $dbTable = $this->getDbTable();
        $dataRows = $dbTable->fetchAll($select)->toArray();

        $listResult = array();

        foreach($dataRows as $index => $value) {
            $listResult[$value['id']] = $value[$columName];
        }

        return $listResult;
    }

    public function selectById($id)
    {
        $select = $this->select()->where('id = ?', $id);
        $resultRow = $this->getDbTable()->fetchRow($select);

        if(false != $resultRow) {
            return $resultRow->toArray();
        }
    }

    /**
     * Извлекает данные одной строки по значению идентификатора
     *
     * @param  $id
     * @return null|Zend_Db_Table_Row_Abstract
     */
    public function fetchDbRowById($id)
    {
        $resultDbRow = $this->fetchDbRowByKey($id, 'id');

        return $resultDbRow;
    }

     /**
     * Извлекает данные нескольких строки по значению идентификатора
     *
     * @param  $id
     * @return null|Zend_Db_Table_Row_Abstract
     */
    public function fetchDbRowsetById($id)
    {
        $resultDbRowset = $this->fetchDbRowsetByKey($id, 'id');

        return $resultDbRowset;
    }

    /**
     * Извлекает данные одной строки по значению ключа
     *
     * @param  int $keyValue Имя ключа
     * @param  string $keyName
     * @return null|Zend_Db_Table_Row_Abstract
     */
    public function fetchDbRowByKey($keyValue, $keyName)
    {
        if(null === $keyValue) {
            return null;
        }

        $select = $this->_getDbSelectByKey($keyName, $keyValue);
        $resultDbRow = $this->getDbTable()->fetchRow($select);

        return $resultDbRow;
    }

    /**
     * Возвращет select-объект, со встроенными параметрами поиска $keyName = $keyValue
     *
     * @param string $keyName
     * @param int $keyValue
     * @return Zend_Db_Select
     */
    protected function _getDbSelectByKey($keyName, $keyValue)
    {
        return $this->select()->where($keyName . ' = ?', $keyValue);
    }

    /**
     * Извлекает данные всех строк по значению ключа
     *
     * @param  int $keyValue Имя ключа
     * @param  string $keyName
     * @return null|Zend_Db_Table_Rowset_Abstract
     */
    public function fetchDbRowsetByKey($keyValue, $keyName)
    {
        if(null === $keyValue) {
            return null;
        }

        $select = $this->_getDbSelectByKey($keyName, $keyValue);
        $resultDbRowset = $this->getDbTable()->fetchAll($select);

        return $resultDbRowset;
    }

    /**
     * @return Zend_Db_Table_Rowset_Abstract
     */
    public function fetchAll($where = null, $order = null, $count = null, $offset = null)
    {
        return $this->getDbTable()->fetchAll($where, $order, $count, $offset);
    }

    public function fetchRow($where = null, $order = null)
    {
        return $this->getDbTable()->fetchRow($where, $order);
    }

    public function getNameById($id)
    {
       $select = $this->select()
            ->where('id = ?', $id);


        $entityRow = $this->getDbTable()->fetchRow($select);

        if(!$entityRow) {
            return false;
        }

        $entityRow = $entityRow->toArray();
        return $entityRow['name'];
    }

    public function getFieldById($id, $fieldName)
    {
       $select = $this->select()
            ->where('id = ?', $id);

        $entityRow = $this->getDbTable()->fetchRow($select);

        if(!$entityRow) {
            return false;
        }

        $entityRow = $entityRow->toArray();

        if(isset($entityRow[$fieldName])) {
            return $entityRow[$fieldName];
        } else {
            return false;
        }
    }



    public function generateFileName($oldName)
    {
        $pathInfo = pathinfo($oldName);
        return substr(md5(uniqid(rand(),1)), 0, 7) . '.' . $pathInfo['extension'];
    }

    public function createFolder($path, $terms = 0775) {
        if(!file_exists($path)) {
            if(!mkdir($path, $terms, true)) {
                 throw new Exception(
                    'It is not possible to create folder:' . $path
                );
            }
        }
    }


    public function getColNames()
    {
        return $this->getDbTable()->info(Zend_Db_Table_Abstract::COLS);
    }

}
?>
